GtkPlacesSidebar: Stop drives that can be stopped
authorMatthias Clasen <mclasen@redhat.com>
Tue, 28 Jan 2014 02:52:01 +0000 (21:52 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 Jan 2014 02:53:49 +0000 (21:53 -0500)
Removable USB drives or memory sticks should be powered down
when the eject button is pressed. For this, we need to call
g_drive_stop() instead of g_drive_eject(), provided the drive
can be stopped.

https://bugzilla.gnome.org/show_bug.cgi?id=723121

gtk/gtkplacessidebar.c

index e53680bef1c08f4b8ab9e1b7f2113cec8bc4936e..738c3b7ab384cf9e72ff35f61b53f6c49f09864b 100644 (file)
@@ -2635,6 +2635,35 @@ unmount_shortcut_cb (GtkMenuItem      *item,
   do_unmount_selection (sidebar);
 }
 
+static void
+drive_stop_cb (GObject      *source_object,
+               GAsyncResult *res,
+               gpointer      user_data)
+{
+  GtkPlacesSidebar *sidebar;
+  GError *error;
+  gchar *primary;
+  gchar *name;
+
+  sidebar = user_data;
+
+  error = NULL;
+  if (!g_drive_stop_finish (G_DRIVE (source_object), res, &error))
+    {
+      if (error->code != G_IO_ERROR_FAILED_HANDLED)
+        {
+          name = g_drive_get_name (G_DRIVE (source_object));
+          primary = g_strdup_printf (_("Unable to stop %s"), name);
+          g_free (name);
+          emit_show_error_message (sidebar, primary, error->message);
+          g_free (primary);
+        }
+      g_error_free (error);
+    }
+
+  g_object_unref (sidebar);
+}
+
 static void
 drive_eject_cb (GObject      *source_object,
                 GAsyncResult *res,
@@ -2738,8 +2767,14 @@ do_eject (GMount           *mount,
     g_volume_eject_with_operation (volume, 0, mount_op, NULL, volume_eject_cb,
                                    g_object_ref (sidebar));
   else if (drive != NULL)
-    g_drive_eject_with_operation (drive, 0, mount_op, NULL, drive_eject_cb,
-                                  g_object_ref (sidebar));
+    {
+      if (g_drive_can_stop (drive))
+        g_drive_stop (drive, 0, mount_op, NULL, drive_stop_cb,
+                      g_object_ref (sidebar));
+      else
+        g_drive_eject_with_operation (drive, 0, mount_op, NULL, drive_eject_cb,
+                                      g_object_ref (sidebar));
+    }
   g_object_unref (mount_op);
 }
 
@@ -2939,35 +2974,6 @@ start_shortcut_cb (GtkMenuItem      *item,
     }
 }
 
-static void
-drive_stop_cb (GObject      *source_object,
-               GAsyncResult *res,
-               gpointer      user_data)
-{
-  GtkPlacesSidebar *sidebar;
-  GError *error;
-  gchar *primary;
-  gchar *name;
-
-  sidebar = user_data;
-
-  error = NULL;
-  if (!g_drive_stop_finish (G_DRIVE (source_object), res, &error))
-    {
-      if (error->code != G_IO_ERROR_FAILED_HANDLED)
-        {
-          name = g_drive_get_name (G_DRIVE (source_object));
-          primary = g_strdup_printf (_("Unable to stop %s"), name);
-          g_free (name);
-          emit_show_error_message (sidebar, primary, error->message);
-          g_free (primary);
-        }
-      g_error_free (error);
-    }
-
-  g_object_unref (sidebar);
-}
-
 static void
 stop_shortcut_cb (GtkMenuItem      *item,
                   GtkPlacesSidebar *sidebar)